#include<iostream>
#include<sys/types.h>
#include<sys/wait.h>
#include<cstring>
#include<unistd.h>
#include<cstdio>

using namespace std ;

int main() {
    // 1. 创建管道
    int pipefd[2] = {0};
    if (pipe(pipefd) != 0) { // 不为 0 说明创建失败
        cerr << "pipe create error" << endl;
    }
    // 否则管道创建成功

    // 2. 创建子进程
    pid_t id = fork(); // 返回子进程的pid，如果是子进程，那么返回 0
    if (id < 0) {
        cerr << "fork error" << endl;
    }
    else if (id == 0) {
        // child
        // child need to read
        close(pipefd[1]);
        #define NUM 1024
        char buf[NUM];
        while (true) {
            memset(buf, '\0', sizeof(buf));
            // ssize_t read(int fd, void* buf, size_t count )
            // 实际读到的长度                    期望读取的长度
            // ssize_t = 0 表示读取到文件结尾
            ssize_t rdret = read(pipefd[0], buf, sizeof(buf) - 1); // 读取到的结果
            if (rdret > 0) {
                buf[rdret] = '\0'; // 最后一个元素置 0
                cout << "receive, message is: " << buf << endl;
            }
            else if (rdret == 0) {
                cout << "read over \n exit with 0" << endl;
                break;
            }
        }

        close(pipefd[0]); 
        // 子进程任务完成，需要退出，父进程需要等待
        exit(0);
    }
    else {
        // parent
        // parent need to write
        close(pipefd[0]);
        const char* msg = "你好，我是你爹";
        int cnt = 0;
        while (cnt ++ < 5) {
            // sprintf(src_str, format,args) 将数据按照指定格式来写入到这个字符串中
            write(pipefd[1], msg, strlen(msg));
            sleep(1);
        }
        close(pipefd[1]);
        cout << "write over" << endl;
    }
    pid_t waitret = waitpid(id, nullptr, 0); // 挂起式等待

    return 0;
}